﻿Imports System.Data.OleDb
Imports System.Text.RegularExpressions

Public Class clsLocation

#Region "attributs"

    Private _noLocation As Integer
    Private _facture As clsFacture
    Private _vehicule As clsVehicule
    Private _noClient As Integer
    Private _dateDebut As Date
    Private _dateFinLocation As Date
    Private _dateVehiculeRemis As Date
    Private _etatReservoirApres As Double
    Private _nbrKmDepart As Integer
    Private _nbrKmRetour As Integer
    Private _actif As Boolean
    Private _commentaire As String
    Private _noCarteDepot As String
    Private _nomCarteDepot As String
    Private _dateExpirationCarteDepot As Date
    Private _modePaiementDepot As String
    Private _montantDepot As Double

#End Region

#Region "constructeurs"

    '********************************************************************************
    ' But:  Initialiser une nouvelle location et, donc, lui attribuer un numéro unique
    '********************************************************************************
    Public Sub New()
        'créé un numéro de catégorie unique pour la nouvelle catégorie
        Dim bd = New cls_GestionBD("taco.mdb")
        bd.remplirDataSet("SELECT MAX(noLocation) AS noMaximum FROM tblLocations", "tbl")

        _noLocation = nvl(bd.dsBd.Tables("tbl").Rows(0).Item("noMaximum"), 0) + 1
        facture = New clsFacture()
        vehicule = New clsVehicule()
        noClient = 0
        dateDebut = FormatDateTime(Now, DateFormat.ShortDate)
        dateFin = FormatDateTime(Now, DateFormat.ShortDate)
        dateVehiculeRemis = FormatDateTime(Now, DateFormat.ShortDate)
        etatReservoir = 0
        nbrKmDepart = 0
        nbrKmRetour = 0
        actif = True
        commentaire = ""
        noCarteDepot = ""
        nomCarteDepot = ""
        dateExpirationCarteDepot = FormatDateTime(Now, DateFormat.ShortDate)
        modePaiementDepot = "Comptant"
        montantDepot = 0

    End Sub

    '********************************************************************************
    ' But:  Initialiser une location à partir des ses informations provenant de la base de données
    ' Paramètres:
    '   row:    Enregistrement résultant d'une requête SELECT * FROM tbl
    '********************************************************************************
    Public Sub New(ByVal row As DataRow)
        With row
            _noLocation = nvl(.Item("noLocation"), 0)

            'crée l'objet facture
            Dim bd As New cls_GestionBD("taco.mdb")
            bd.daBd.SelectCommand = New OleDbCommand( _
                "SELECT * " & _
                "FROM tblFactures " & _
                "WHERE noFacture = @numero")
            bd.daBd.SelectCommand.Parameters.Add("@numero", OleDbType.Integer).Value = .Item("noFacture")
            bd.remplirDataSet("tbl")

            If bd.dsBd.Tables("tbl").Rows.Count = 1 Then
                facture = New clsFacture(bd.dsBd.Tables("tbl").Rows(0))
            Else
                MsgBox("ERREUR: Impossible d'assigner la facture." & vbCrLf & _
                       "Une nouvelle facture sera utilisée en remplacement.")
                facture = New clsFacture
            End If

            'crée l'objet véhicule
            bd = New cls_GestionBD("taco.mdb")
            bd.daBd.SelectCommand = New OleDbCommand( _
                "SELECT * " & _
                "FROM tblVehicules " & _
                "WHERE noVehicule = @numero")
            bd.daBd.SelectCommand.Parameters.Add("@numero", OleDbType.Integer).Value = .Item("noVehicule")
            bd.remplirDataSet("tbl")

            If bd.dsBd.Tables("tbl").Rows.Count = 1 Then
                vehicule = New clsVehicule(bd.dsBd.Tables("tbl").Rows(0))
            Else
                MsgBox("ERREUR: Impossible d'assigner le véhicule." & vbCrLf & _
                       "Un nouveau véhicule sera utilisé en remplacement.")
                vehicule = New clsVehicule
            End If

            noClient = nvl(.Item("noClient"), 0)
            dateDebut = nvl(.Item("dateDebut"), FormatDateTime(Now, DateFormat.ShortDate))
            dateFin = nvl(.Item("dateFinLocation"), FormatDateTime(dateDebut, DateFormat.ShortDate))
            dateVehiculeRemis = nvl(.Item("dateVehiculeRemis"), FormatDateTime(dateFin, DateFormat.ShortDate))
            etatReservoir = nvl(.Item("etatReservoirApres"), 0)
            nbrKmDepart = nvl(.Item("nbrKmDepart"), 0)
            nbrKmRetour = nvl(.Item("nbrKmRetour"), 0)
            actif = nvl(.Item("actif"), True)
            commentaire = nvl(.Item("commentaire"), "")
            noCarteDepot = nvl(.Item("noCarteDepot"), "")
            nomCarteDepot = nvl(.Item("nomCarteDepot"), "")
            dateExpirationCarteDepot = nvl(.Item("dateExpirationCarteDepot"), FormatDateTime(Now, DateFormat.ShortDate))
            modePaiementDepot = nvl(.Item("modePaiementDepot"), "Comptant")
            montantDepot = nvl(.Item("montantDepot"), 0)
        End With
    End Sub

#End Region

#Region "get/set"

    ReadOnly Property noLocation() As Integer
        Get
            Return _noLocation
        End Get
    End Property

    Property facture() As Object
        Get
            Return _facture
        End Get
        Set(ByVal value As Object)

            Try

                ' convertit le paramètre dans le bon type
                value = CType(value, clsFacture)

                _facture = value

            Catch ex As Exception
                MsgBox("ERREUR: La facture doit être une instance de la classe << clsFacture >>." & vbCrLf & _
                       "Une nouvelle facture sera créée et utilisée en remplacement.")
                _facture = New clsFacture()
            End Try



        End Set
    End Property

    Property vehicule() As Object
        Get
            Return _vehicule
        End Get
        Set(ByVal value As Object)

            Try

                ' convertit le paramètre dans le bon type
                value = CType(value, clsVehicule)

                _vehicule = value

            Catch ex As Exception
                MsgBox("ERREUR: Le véhicule doit être une instance de la classe << clsVehicule >>." & vbCrLf & _
                       "Un nouveau véhicule sera créé et utilisé en remplacement.")
                _vehicule = New clsVehicule()
            End Try



        End Set
    End Property

    Property noClient() As Object
        Get
            Return _noClient
        End Get
        Set(ByVal value As Object)

            Try

                'convertit le paramètre dans le bon format
                value = CInt(value)

                _noClient = value

            Catch ex As Exception
                MsgBox("ERREUR: Le numéro de client doit être un nombre." & vbCrLf & _
                       "La valeur << 0 >> sera utilisé en remplacement.")
                _nbrKmDepart = 0
            End Try


        End Set
    End Property

    Property dateDebut() As Object
        Get
            Return _dateDebut
        End Get
        Set(ByVal value As Object)

            Try

                'convertit le paramètre dans le bon type
                value = CDate(value)

                _dateDebut = value

            Catch ex As Exception
                MsgBox("La date de début doit être de type date." & vbCrLf & _
                       "La date << " & FormatDateTime(Now, DateFormat.ShortDate) & ">> sera utilisé en remplacement.", _
                       MsgBoxStyle.Exclamation, _
                       "ERREUR: clsLocation")
                _dateDebut = FormatDateTime(Now, DateFormat.ShortDate)
            End Try

        End Set
    End Property

    Property dateFin() As Object
        Get
            Return _dateFinLocation
        End Get
        Set(ByVal value As Object)

            Try

                'convertit le paramètre dans le bon type
                value = CDate(value)

                'vérifie si le paramètre respecte les spécifications
                If value >= dateDebut Then
                    _dateFinLocation = value
                Else
                    Throw New Exception
                End If

            Catch ex As Exception
                MsgBox("La date de fin de la location doit être plus grande ou égale à la date de début." & vbCrLf & _
                       "La date << " & FormatDateTime(dateDebut, DateFormat.ShortDate) & ">> sera utilisé en remplacement.", MsgBoxStyle.Exclamation, "ERREUR: clsLocation")
                _dateFinLocation = FormatDateTime(dateDebut, DateFormat.ShortDate)
            End Try


        End Set
    End Property

    Property dateVehiculeRemis() As Object
        Get
            Return _dateVehiculeRemis
        End Get
        Set(ByVal value As Object)

            Try

                'convertit le paramètre dans le bon format
                value = CDate(value)

                'vérifie si le paramètre respecte les spécifications
                If value >= dateDebut Then
                    _dateVehiculeRemis = value
                Else
                    Throw New Exception
                End If

            Catch ex As Exception
                MsgBox("ERREUR: La date de remise du véhicule doit être plus grande ou égale à la date de début." & _
                       "La date << " & FormatDateTime(dateDebut, DateFormat.ShortDate) & ">> sera utilisé en remplacement.")
                _dateVehiculeRemis = FormatDateTime(dateDebut, DateFormat.ShortDate)
            End Try

        End Set
    End Property

    Property etatReservoir() As Object
        Get
            Return _etatReservoirApres
        End Get
        Set(ByVal value As Object)

            Try

                'convertit le paramètre dans le bon format
                value = CDbl(value)

                'vérifie si le paramètre respecte les spécifications
                If value >= 0 And value <= 100 Then
                    _etatReservoirApres = value
                Else
                    Throw New Exception
                End If

            Catch ex As Exception
                MsgBox("ERREUR: L'état du réservoir doit être un nombre entre 0 et 100." & vbCrLf & _
                       "La valeur << 0 >> sera utilisée en remplacement.")
                _etatReservoirApres = 0
            End Try

        End Set
    End Property

    Property nbrKmDepart() As Object
        Get
            Return _nbrKmDepart
        End Get
        Set(ByVal value As Object)

            Try

                'convertit le paramètre dans le bon format
                value = CInt(value)

                'vérifie si le paramètre respecte les spécifications
                If value >= 0 Then
                    _nbrKmDepart = value
                Else
                    Throw New Exception
                End If

            Catch ex As Exception
                MsgBox("ERREUR: Le nombre de kilomètres du véhicule au départ doit être un nombre entier plus grand ou égale à zéro." & vbCrLf & _
                       "La valeur << 0 >> sera utilisé en remplacement.")
                _nbrKmDepart = 0
            End Try

        End Set
    End Property

    Property nbrKmRetour() As Object
        Get
            Return _nbrKmRetour
        End Get
        Set(ByVal value As Object)

            Try

                'convertit le paramètre dans le bon format
                value = CInt(value)

                'vérifie si le paramètre respecte les spécifications
                If value >= 0 Then
                    _nbrKmRetour = value
                Else
                    Throw New Exception
                End If

            Catch ex As Exception
                MsgBox("ERREUR: Le nombre de kilomètres du véhicule au retour doit être un nombre entier plus grand ou égale à zéro." & vbCrLf & _
                       "La valeur << 0 >> sera utilisé en remplacement.")
                _nbrKmRetour = 0
            End Try

        End Set
    End Property

    Property actif() As Object
        Get
            Return _actif
        End Get
        Set(ByVal value As Object)

            Try

                'convertit le paramètre dans le bon format
                value = CBool(value)

                _actif = value

            Catch ex As Exception
                MsgBox("ERREUR: La valeur de actif peut être soit << True >> ou << False >>." & vbCrLf & _
                       "La valeur de actif << True >> sera utilisé en remplacement.")
                _actif = ""
            End Try

        End Set
    End Property

    Property commentaire() As Object
        Get
            Return _commentaire
        End Get
        Set(ByVal value As Object)

            Try
                ' convertit le paramètre dans le bon type
                value = CStr(value)

                _commentaire = value

            Catch ex As Exception
                MsgBox("ERREUR: Le commentaire doit être une chaine de caractères." & vbCrLf & _
                       "Le commentaire << >> sera utilisé en remplacement.")
                _commentaire = ""
            End Try

        End Set
    End Property

    Property noCarteDepot() As Object
        Get
            Return _noCarteDepot
        End Get
        Set(ByVal value As Object)

            Try
                ' convertit le paramètre dans le bon type
                value = CStr(value)

                'vérifie si le paramètre respecte les spécifications
                Dim regNoCarteDepot As New Regex("^([4]{1})([0-9]{12,15})$")

                If regNoCarteDepot.IsMatch(value) Or value.Length = 0 Then
                    _noCarteDepot = value
                Else
                    Throw New Exception
                End If

            Catch ex As Exception
                MsgBox("ERREUR: Le numéro de carte doit être une chaine de caractères 13 à 16 caractères et commencant par un << 4 >>." & vbCrLf & _
                       "Le numéro de carte << >> sera utilisé en remplacement.")
                _noCarteDepot = ""
            End Try

        End Set
    End Property

    Property nomCarteDepot() As Object
        Get
            Return _nomCarteDepot
        End Get
        Set(ByVal value As Object)

            Try
                ' convertit le paramètre dans le bon type
                value = CStr(value)

                _nomCarteDepot = value

            Catch ex As Exception
                MsgBox("ERREUR: Le nom sur la carte doit être une chaine de caractères." & vbCrLf & _
                       "La valeur << >> sera utilisé en remplacement.", _
                       MsgBoxStyle.Information, _
                       "ERREUR: clsLocation")
                _nomCarteDepot = ""
            End Try

        End Set
    End Property

    Property dateExpirationCarteDepot() As Object
        Get
            Return _dateExpirationCarteDepot
        End Get
        Set(ByVal value As Object)

            Try

                'convertit le paramètre dans le bon type
                value = CDate(value)

                'vérifie si le paramètre respecte les spécifications
                If value >= dateDebut Then
                    _dateExpirationCarteDepot = value
                Else
                    Throw New Exception
                End If

            Catch ex As Exception
                MsgBox("ERREUR: La date d'expiration de la carte doit être plus grande ou égale à la date de début de la location." & _
                       "La date << " & FormatDateTime(dateFin, DateFormat.ShortDate) & ">> sera utilisé en remplacement.")
                _dateExpirationCarteDepot = FormatDateTime(dateFin, DateFormat.ShortDate)
            End Try

        End Set
    End Property

    Property modePaiementDepot() As Object
        Get
            Return _modePaiementDepot
        End Get
        Set(ByVal value As Object)

            Try

                ' convertit le paramètre dans le bon type
                value = CStr(value)

                Dim regModePaiement As New Regex("^(Comptant|Carte de crédit|Carte de débit)$")

                'vérifie si le paramètre respecte les spécifications
                If regModePaiement.IsMatch(value) Then
                    _modePaiementDepot = value
                Else
                    Throw New Exception
                End If

            Catch ex As Exception
                MsgBox("ERREUR: Le mode de paiement du dépot doit être une chaine de caractères." & vbCrLf & _
                       "Le mode de paiement << Comptant >> sera utilisé en remplacement.")
                _modePaiementDepot = "Comptant"
            End Try

        End Set
    End Property

    Property montantDepot() As Object
        Get
            Return _montantDepot
        End Get
        Set(ByVal value As Object)

            Try

                ' convertit le paramètre dans le bon type
                value = CInt(value)

                ' vérifie si le paramètre respecte les spécifications
                If value >= 0 Then
                    _montantDepot = value
                Else
                    Throw New Exception
                End If

            Catch ex As Exception
                MsgBox("ERREUR: Le montant du dépot doit être un nombre plus grand ou égale à zéro." & vbCrLf & _
                       "La valeur << 0 >> sera utilisé en remplacement.")
                _montantDepot = 0
            End Try

        End Set
    End Property

#End Region

#Region "méthodes"

    '********************************************************************************
    ' But:  Enregistrer la location, sa facture et son véhicule dans la base de données
    '********************************************************************************
    Public Sub enregistrer()
        'importe le véhicule de la base de données
        Dim bd As New cls_GestionBD("taco.mdb")
        bd.daBd.SelectCommand = New OleDbCommand("SELECT * FROM tblLocations where noLocation = @numero")
        bd.daBd.SelectCommand.Parameters.Add("@numero", OleDbType.Integer).Value = noLocation
        bd.remplirDataSet("tbl")

        'met à jour le véhicule si elle existe déjà dans la base de données
        If bd.dsBd.Tables("tbl").Rows.Count = 1 Then
            With bd.dsBd.Tables("tbl").Rows(0)
                .Item("noLocation") = noLocation
                facture.enregistrer()
                .Item("noFacture") = facture.noFacture
                vehicule.enregistrer()
                .Item("noVehicule") = vehicule.noVehicule
                .Item("noClient") = noClient
                .Item("dateDebut") = dateDebut
                .Item("dateFinLocation") = dateFin
                .Item("dateVehiculeRemis") = dateVehiculeRemis
                .Item("etatReservoirApres") = etatReservoir
                .Item("nbrKmDepart") = nbrKmDepart
                .Item("nbrKmRetour") = nbrKmRetour
                .Item("actif") = actif
                .Item("commentaire") = commentaire
                .Item("noCarteDepot") = noCarteDepot
                .Item("nomCarteDepot") = nomCarteDepot
                .Item("dateExpirationCarteDepot") = dateExpirationCarteDepot
                .Item("modePaiementDepot") = modePaiementDepot
                .Item("montantDepot") = montantDepot
            End With

            'créé un nouvel enregistrement si le véhicule n'existe pas encore dans la base de données
        ElseIf bd.dsBd.Tables("tbl").Rows.Count = 0 Then

            Dim lNewRow As DataRow
            lNewRow = bd.dsBd.Tables("tbl").NewRow

            With lNewRow
                .Item("noLocation") = noLocation
                facture.enregistrer()
                .Item("noFacture") = facture.noFacture
                vehicule.enregistrer()
                .Item("noVehicule") = vehicule.noVehicule
                .Item("noClient") = noClient
                .Item("dateDebut") = dateDebut
                .Item("dateFinLocation") = dateFin
                .Item("dateVehiculeRemis") = dateVehiculeRemis
                .Item("etatReservoirApres") = etatReservoir
                .Item("nbrKmDepart") = nbrKmDepart
                .Item("nbrKmRetour") = nbrKmRetour
                .Item("actif") = actif
                .Item("commentaire") = commentaire
                .Item("noCarteDepot") = noCarteDepot
                .Item("nomCarteDepot") = nomCarteDepot
                .Item("dateExpirationCarteDepot") = dateExpirationCarteDepot
                .Item("modePaiementDepot") = modePaiementDepot
                .Item("montantDepot") = montantDepot
            End With

            bd.dsBd.Tables("tbl").Rows.Add(lNewRow)

        End If

        'met à jour la base de données
        bd.miseAJourBD("tbl")
    End Sub

    '********************************************************************************
    ' But:  Supprimer la location de la base de données
    '********************************************************************************
    Public Sub supprimer()
        'importe la location de la base de données
        Dim bd As New cls_GestionBD("taco.mdb")
        bd.daBd.SelectCommand = New OleDbCommand("SELECT * FROM tblLocations where noLocation = @numero")
        bd.daBd.SelectCommand.Parameters.Add("@numero", OleDbType.Integer).Value = noLocation
        bd.remplirDataSet("tbl")

        'supprime la location si elle existe dans la base de données, sinon, affiche un message d'erreur
        If bd.dsBd.Tables("tbl").Rows.Count = 1 Then
            bd.dsBd.Tables("tbl").Rows(0).Delete()
        ElseIf bd.dsBd.Tables("tbl").Rows.Count = 0 Then
            MsgBox("ERREUR: La location n'existe pas dans la base de données." & vbCrLf & _
                   "Il est donc impossible de la supprimer.")
        End If

        'met à jour la base de données
        bd.miseAJourBD("tbl")

    End Sub

    '********************************************************************************
    ' But:  Afficher tous les attributs de la location, de sa facture et de son véhicule
    ' Return:   Une chaine de caractère contenant chaque attribut accompagné de sa valeur
    '********************************************************************************
    Public Overrides Function ToString() As String
        Dim reponse As String = "noLocation:" & vbTab & noLocation & vbCrLf & _
                "facture:" & vbCrLf & facture.ToString & vbCrLf & _
                "vehicule:" & vbCrLf & vehicule.ToString & vbCrLf & _
                "noClient:" & vbTab & noClient & vbCrLf & _
                "dateDebut:" & vbTab & dateDebut & vbCrLf & _
                "dateFin:" & vbTab & dateFin & vbCrLf & _
                "dateVehiculeRemis:" & vbTab & dateVehiculeRemis & vbCrLf & _
                "etatReservoir:" & vbTab & etatReservoir & vbCrLf & _
                "nbrKmDepart:" & vbTab & nbrKmDepart & vbCrLf & _
                "actif:" & vbTab & actif & vbCrLf & _
                "commentaire:" & vbTab & commentaire & vbCrLf & _
                "noCarteDepot:" & vbTab & noCarteDepot & vbCrLf & _
                "nomCarteDepot:" & vbTab & nomCarteDepot & vbCrLf & _
                "dateExpirationCarteDepot:" & vbTab & dateExpirationCarteDepot & vbCrLf & _
                "modePaiementDepot:" & vbTab & modePaiementDepot & vbCrLf & _
                "montantDepot:" & vbTab & montantDepot

        Return reponse
    End Function

#End Region

End Class